package ManagedBeans;

import ComponenteDatos.IngresosFacadeLocal;
import ComponenteEntidad.Agencia;
import ComponenteEntidad.Ingresos;
import ComponenteEntidad.Tipoingreso;
import ComponenteEntidad.Empleado;
import ComponenteEntidad.Tipocomprobante;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.SelectEvent;
import org.primefaces.event.UnselectEvent;

@ManagedBean
@SessionScoped
public class ManagedBeanIngresos implements Serializable{

    @EJB
    private IngresosFacadeLocal IngresosFacade;
    private Ingresos objetoIngresos;
    private Ingresos objetoIngresosCrear;
    private Tipoingreso objetoTipoingreso;
    private Agencia objetoAgencia;
    private Tipocomprobante objetoTipocomprobante;
    private Empleado objetoEmpleado;
    private List<Ingresos> lista;
    private List<SelectItem> objetoItems = new LinkedList<SelectItem>();
    private List<SelectItem> objetoItems2 = new LinkedList<SelectItem>();
    private HashMap<Integer, Ingresos> myobjeto = new HashMap<Integer, Ingresos>();
    private Date fechaIngreso;
    public ManagedBeanIngresos() {
        objetoIngresos = new Ingresos();
        objetoIngresos.setIdIngresos(1);

        objetoEmpleado = new Empleado();
        objetoTipoingreso = new Tipoingreso();
        objetoTipocomprobante = new Tipocomprobante();
        objetoAgencia =  new Agencia();

        lista = new LinkedList<Ingresos>();
        objetoIngresosCrear = new Ingresos();
        objetoIngresosCrear.setIngAcreedor("");
        objetoIngresosCrear.setIngDetalle("");
        objetoIngresosCrear.setIngNroDocComp("");
        objetoIngresosCrear.setIngEstado(true);
        objetoIngresosCrear.setIngFecha(null);
        objetoIngresosCrear.setIngMonto(null);
        // yury
        fechaIngreso= new Date();
    }

    public Date getFechaIngreso() {
        return fechaIngreso;
    }

    public void setFechaIngreso(Date fechaIngreso) {
        this.fechaIngreso = fechaIngreso;
    }

    public List<SelectItem> getObjetoItems() {
        lista = new ArrayList<Ingresos>();
        objetoItems = new LinkedList<SelectItem>();
        lista = IngresosFacade.findAll();
        for (Ingresos p : lista) {
            if (p.getIngEstado() == true) {
                myobjeto.put(p.getIdIngresos(), p);
                objetoItems.add(new SelectItem(p, p.getIngNroDocComp()));
            }
        }
        return objetoItems;
    }

    public Agencia getObjetoAgencia() {
        return objetoAgencia;
    }

    public void setObjetoAgencia(Agencia objetoAgencia) {
        this.objetoAgencia = objetoAgencia;
    }
    
    public void setObjetoItems(List<SelectItem> objetoItems) {
        this.objetoItems = objetoItems;
    }

    public Tipocomprobante getObjetoTipocomprobante() {
        return objetoTipocomprobante;
    }

    public void setObjetoTipocomprobante(Tipocomprobante objetoTipocomprobante) {
        this.objetoTipocomprobante = objetoTipocomprobante;
    }

    public Empleado getObjetoEmpleado() {
        return objetoEmpleado;
    }

    public void setObjetoEmpleado(Empleado objetoEmpleado) {
        this.objetoEmpleado = objetoEmpleado;
    }

    public Tipoingreso getObjetoTipoingreso() {
        return objetoTipoingreso;
    }

    public void setObjetoTipoingreso(Tipoingreso objetoTipoingreso) {
        this.objetoTipoingreso = objetoTipoingreso;
    }

    public Ingresos getObjetoIngresos() {
        return objetoIngresos;
    }

    public Ingresos getObjetoIngresos(int id) {
        return (Ingresos) myobjeto.get(id);
    }

    public void setObjetoIngresos(Ingresos objetoIngresos) {
        this.objetoIngresos = objetoIngresos;
    }

    public Ingresos getObjetoIngresosCrear() {
        return objetoIngresosCrear;
    }

    public void setObjetoIngresosCrear(Ingresos objetoIngresosCrear) {
        this.objetoIngresosCrear = objetoIngresosCrear;
    }

    public List<SelectItem> getObjetoItems2() {
        return objetoItems2;
    }

    public void setObjetoItems2(List<SelectItem> objetoItems2) {
        this.objetoItems2 = objetoItems2;
    }

    public List<Ingresos> lista(ManagedBeanIniciosesion sesion) {
        lista = new LinkedList<Ingresos>();
        List<Ingresos> listaTemporal = new LinkedList<Ingresos>();
        listaTemporal = IngresosFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getIngEstado() == true && listaTemporal.get(i).getEmpleado().equals(sesion.getObjetoEmpleado()) && !listaTemporal.get(i).getEmpleado().getCargo().getCarCargo().equalsIgnoreCase("ADMINISTRADOR")) {
                lista.add(listaTemporal.get(i));
            }else if(listaTemporal.get(i).getIngEstado() == true && listaTemporal.get(i).getEmpleado().getCargo().getCarCargo().equalsIgnoreCase("ADMINISTRADOR")){
                lista.add(listaTemporal.get(i));
            }
            
        }
        return lista;
    }

    public void setLista(List<Ingresos> lista) {
        this.lista = lista;
    }

    public HashMap<Integer, Ingresos> getMyobjeto() {
        return myobjeto;
    }

    public void setMyobjeto(HashMap<Integer, Ingresos> myobjeto) {
        this.myobjeto = myobjeto;
    }

    public void insertar(ManagedBeanIniciosesion sesion) {
        try {
            if (!verificarSiexiste(objetoIngresosCrear.getIngNroDocComp())) {
                objetoIngresosCrear.setIngEstado(true);
                objetoIngresosCrear.setTipoingreso(objetoTipoingreso);
                objetoIngresosCrear.setEmpleado(objetoEmpleado);
                objetoIngresosCrear.setTipocomprobante(objetoTipocomprobante);
                objetoIngresosCrear.setEmpleado(sesion.getObjetoEmpleado());
                objetoIngresosCrear.setAgencia(sesion.getObjetoEmpleado().getAgencia());
                objetoIngresosCrear.setIngEstadoIngreso(1);
                // yury, los ingresos son por dia esta fecha nunca se debe mover.
                objetoIngresosCrear.setIngFecha(new Date());
                IngresosFacade.create(objetoIngresosCrear); 
                
                FacesMessage msg = new FacesMessage("Informacion", "Registro Ingresado");
                FacesContext.getCurrentInstance().addMessage(null, msg);
                objetoIngresosCrear = new Ingresos();
            } else {
                FacesMessage msg = new FacesMessage("Informacion", "Ya Existe Numero de Comprobante de Ingreso");
                FacesContext.getCurrentInstance().addMessage(null, msg);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void editar() {
        try {
            IngresosFacade.edit(objetoIngresos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void eliminar() {
        try {
            objetoIngresos.setIngEstado(false);
            IngresosFacade.edit(objetoIngresos);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void onRowSelect(SelectEvent event) {
        FacesMessage msg = new FacesMessage("Ingresos Seleccionado", ((Ingresos) event.getObject()).getIdIngresos().toString());
        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public void onRowUnselect(UnselectEvent event) {
        FacesMessage msg = new FacesMessage("Ingresos No seleccionado", ((Ingresos) event.getObject()).getIdIngresos().toString());

        FacesContext.getCurrentInstance().addMessage(null, msg);
    }

    public boolean verificarSiexiste(String desc) {
        boolean existe = false;
        lista = new LinkedList<Ingresos>();
        List<Ingresos> listaTemporal = new LinkedList<Ingresos>();
        listaTemporal = IngresosFacade.findAll();
        for (int i = listaTemporal.size() - 1; i >= 0; i--) {
            if (listaTemporal.get(i).getIngNroDocComp().equalsIgnoreCase(desc) && listaTemporal.get(i).getIngEstado() == true) {
                existe = true;
            }
        }

        return existe;
    }

    public void cargarIngresoxTipoingreso() {
        lista = new ArrayList<Ingresos>();
        objetoItems2 = new LinkedList<SelectItem>();
        lista = IngresosFacade.findAll();
        for (Ingresos p : lista) {
            if (p.getTipoingreso().getIdTipoIngreso() == objetoIngresos.getTipoingreso().getIdTipoIngreso()) {
                myobjeto.put(p.getIdIngresos(), p);
                objetoItems2.add(new SelectItem(p, p.getIngNroDocComp()));
                // System.out.println("en el if");
            }
        }
    }
}
